# Описание приложения

**Тестовое задание** - *Banking Service*

***Banking Service*** - это приложение разработано на базе *Spring Boot* и использует *PostgreSQL* в качестве базы
данных. Оно предназначено для проведения транзакций и начисления процентов на кошельки пользователей.

## Как работает Banking Service

Приложение работает по следующему алгоритму:

1. При проведении транзакции или начислении процентов происходит *блокировка* записей кошельков отправителя и получателя
   в базе данных.
2. Проверяется возможность блокировки обоих кошельков. Если это возможно (т.е. ни одна из записей не заблокирована), то
   происходит перевод денег между ними.
3. В случае, если один или оба кошелька уже заблокированы, операция добавляется в *очередь* для последующей обработки.
4. По окончании операции, отправляется *сообщение* с помощью *Socket* о результате перевода (используется STOMP протокол
   и библиотека Sock.js).


## Минусы данной реализации

- Уровень изоляции бд - seril., что говорит нам о том,что транзакции выполняются в порядке очереди (скорость снижена)
- Вместо блокировки всего баланса, можно блокировать только часть баланса (реализация через доп. таблицу)
- Обновление баланса работает каждые 5 мин, даже если пользователь создан 1 минуту назад, а сервер запущен 4 минуты назад
- установка LOCK optimistic (блокировка на уровне приложения) скорее всего окажется быстрее(и уровень изоляции можно поннизить) при нагрузочном тестировании чем seril

## Установка и запуск

Чтобы установить и запустить приложение, выполните следующие шаги:

1. Убедитесь, что у вас установлена Java Development Kit (JDK) версии 17 или выше.
2. Скачайте репозиторий Banking Service на свой локальный компьютер.
3. В корневой папке проекта выполните следующую команду для сборки и установки приложения:

gradle clean build

4. Запустите приложение, выполнив следующую команду:

```access transformers
java -jar build/libs/*.jar
```

5. Откройте веб-браузер и перейдите по адресу http://localhost:8080/swagger-ui/index.html#/, чтобы получить доступ к
   сваггеру.

## Логирование

Логи приложения Banking Service записываются в файл Banking Service.log. Для логирования событий и ошибок приложения
используется библиотека SLF4J с реализацией Logback.

## Технологии

Banking Service использует следующие технологии:

- Spring Boot - для быстрой и простой разработки приложения.
- PostgreSQL - в качестве базы данных для хранения записей кошельков и транзакций.
- SLF4J и Logback - для логирования событий и ошибок приложения.
- STOMP протокол и Sock.js - для передачи сообщений о результате транзакций по сокетам.

## Для теста

```

docker-compose up -d
```

## Если не будет подключаться к бд

```
psql -U root banking_service
ALTER USER root WITH PASSWORD 'Dert869$';
```
